﻿ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Wrapper_Algos;

namespace Civilisation_code.PCarte
{
    /// <summary>
    /// Classe abstraite contenant les méthodes à définir et la carte qui devra être créé
    /// </summary>
    abstract class Algo_Carte
    {
        /// <summary>
        /// Carte créé par l'algorithme
        /// </summary>
        public Carte _carte { get; set; }

        /// <summary>
        /// Wrapper utilisé
        /// </summary>
        protected Wrapper w;

        /// <summary>
        /// Méthode dont le but est de construire la carte
        /// </summary>
        abstract public void construire();

        /// <summary>
        /// Méthode dont le but est de recevoir le type des cases généré par le wrapper
        /// </summary>
        unsafe abstract protected void genererCases();

        /// <summary>
        /// Méthode dont le but est de récupérer la position des joueurs au départ
        /// </summary>
        /// <param name="nbre_joueurs">Nombre des joueurs de la partie</param>
        /// <returns>Liste des cases de la position de départ des joueurs</returns>
        /// <remarks>
        /// Le premier élément de liste renvoyé correspondra à la case de départ du premier joueur, et ainsi de suite
        /// </remarks>
        unsafe public List<Case> getPositionsJoueurs(int nbre_joueurs)
        {
            int* infos = w.getPositionJoueurs(nbre_joueurs);

            List<Case> cases = new List<Case>();
            for (int i = 0; i < nbre_joueurs * 2; i = i + 2)
            {
                cases.Add(_carte.getCase(infos[i], infos[i + 1]));
            }
            return cases;
        }


        /// <summary>
        /// Méthode dont le but est de créer les cases de carte
        /// </summary>
        /// <param name="w_cases">Tableau de int envoyé par le wrapper contenant le type de ressource de chaque case</param>
        /// <param name="x">Position sur l'axe des abscisses de la case à créer</param>
        /// <param name="y">Position sur l'axe des ordonnées de la case à créer</param>
        /// <param name="largeur">Largeur de la carte</param>
        unsafe abstract protected void traitement_num_cases(int* w_cases, int x, int y, int largeur);



    }
}
